package com.ys.util.jwt;

import java.io.UnsupportedEncodingException;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JwtUtil {
	
	private static String secretKey = "i93Dfj8q3329KDakcjfa";
	
    public static void main(String[] args) {
    	String token = getToken("123");
    	System.out.println(token);
    	
    	System.out.println(getUserIdFromToken(token));
	}
    
    /**
     * 生成加密后的token
     * @param isVip 是不是VIP,true表示是VIP，false表示不是VIP。
     * @param username 用户名
     * @param name  姓名
     * @return 加密后的token
     */
    public static String getToken(String userId) {
        String token = null;
        try {
            Date expiresAt = new Date(System.currentTimeMillis() + 24L * 60L * 60L * 1000L * 30L);
            token = JWT.create()
                .withIssuer("auth0")
                .withClaim("userId", userId)
                .withExpiresAt(expiresAt)
                // 使用了HMAC256加密算法。
                // mysecret是用来加密数字签名的密钥。
                .sign(Algorithm.HMAC256(secretKey));
        } catch (JWTCreationException e){
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return token;
    }
    
    /**
     * 生成加密后的token
     * @param isVip 是不是VIP,true表示是VIP，false表示不是VIP。
     * @param userId 用户名
     * @return 加密后的token
     */
    public static String getAccessToken(String userId) {
        String token = null;
        try {
            Date expiresAt = new Date(System.currentTimeMillis() + 24L * 60L * 60L * 1000L * 30L);
            token = JWT.create()
                .withIssuer("auth0")
                .withClaim("userId", userId)
                .withExpiresAt(expiresAt)
                // 使用了HMAC256加密算法。
                // mysecret是用来加密数字签名的密钥。
                .sign(Algorithm.HMAC256(secretKey));
        } catch (JWTCreationException e){
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return token;
    }
    
    private static DecodedJWT decrypt(String token) {
        DecodedJWT jwt = null;
        try {
            // 使用了HMAC256加密算法。
            // mysecret是用来加密数字签名的密钥。
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secretKey))
                .withIssuer("auth0")
                .build();
            jwt = verifier.verify(token);
        } catch (JWTVerificationException e){
            e.printStackTrace();
            return null;
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
        return jwt;
    }
    
    public static String getUserIdFromRequest(HttpServletRequest request) {

    	String token = request.getHeader("authorization");
    	if (token == null || token.length() == 0) {
			return null;
		}
    	DecodedJWT jwt = decrypt(token);
    	if (jwt == null) {
			return null;
		}
    	return jwt.getClaim("userId").asString();
    }
    
    public static String getUserIdFromToken(String token) {

    	DecodedJWT jwt = decrypt(token);
    	if (jwt == null) {
			return null;
		}
    	return jwt.getClaim("userId").asString();
    }
}
